package com.atguigu.lease.web.admin.interceptors;

import com.atguigu.lease.common.advice.LeaseException;
import com.atguigu.lease.common.jwt.JwtUtil;
import com.atguigu.lease.common.result.ResultCodeEnum;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.HandlerInterceptor;

public class LoginInterceptor implements HandlerInterceptor {
    /**
 * 在请求处理之前进行预处理，主要用于验证访问令牌
 * 此方法的目的是确保每个进入系统的请求都带有有效的访问令牌，以防止未经授权的访问
 *
 * @param request HttpServletRequest对象，用于获取请求头中的访问令牌
 * @param response HttpServletResponse对象，通常不直接使用，但必须提供以符合方法签名
 * @param handler 处理请求的对象，通常不直接使用，但必须提供以符合方法签名
 * @return 始终返回true，表示继续执行其他处理器，因为如果验证失败，会直接抛出异常中断执行
 * @throws Exception 如果访问令牌为空或无效，将抛出异常，中断当前请求的处理
 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 从请求头中获取访问令牌
    String accessToken = request.getHeader("access_token");
    // 检查访问令牌是否为空，如果为空，则抛出异常，表明未提供登录认证信息
    if(ObjectUtils.isEmpty(accessToken)){
        throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
    }
    // 解析访问令牌，如果令牌无效，JwtUtil内部将抛出异常，此处无需额外处理
    JwtUtil.parseToken(accessToken);
    // 访问令牌验证通过，继续执行其他处理器
    return true;
}

}
